#pragma once

#include <atomic>
#include <memory>
#include "base_noncopyable.h"
#include "stream_frame.h"

namespace El {
namespace Record {

class IPlayback;
using PlaybackPtr = std::shared_ptr<IPlayback>;

class IPlayback {

public:
    using Proc = std::function<void(Media::MediaFramePtr &)>;
    
    virtual ~IPlayback() = default;

    static PlaybackPtr create();

    /// 设置开始和结束时间
    /// \param start 开始时间
    /// \param end 结束时间
    /// \return 配置参数无效，返回false，否则返回true
    virtual bool config(int32_t ch, uint32_t start, uint32_t end) = 0;

    /// 设置文件路径
    /// \param path 文件路径
    /// \return 配置参数无效，返回false，否则返回true
    virtual bool config(const std::string &path) = 0;

    /// 开始读流数据，数据包通过proc回调
    /// \param start 开始时间
    /// \param end 结束时间
    /// \return 没有文件返回失败，否则返回成功
    virtual bool start(const Proc &proc) = 0;

    /// 停止读流数据
    /// \return 是否关闭成功
    virtual bool stop() = 0;

    /// 暂停读数据，同时暂停回调函数掉用
    /// \return 是否暂停成功
    virtual bool pause() = 0;

    /// 恢复读数据，同时恢复回调函数掉调用
    /// \return 是否恢复成功
    virtual bool resume() = 0;

    /// 按时间定位。
    /// \param [in] UTC单位秒,要定位的录像文件时间
    /// \return 定位是否成功
    virtual bool seekByTime(uint32_t time) = 0;

    /// 设置流读取的速度倍数。
    /// \param speed 速度倍数，<1 表示慢放倍数，=1表示正常回放，>1表示快放倍数，<=0无效
    /// \return 设置速度是否成功
    virtual bool setSpeed(float speed) = 0;
};

} // namespace Record
} // namespace El